Learn egg.js from jspang

跟着JSPang学习egg.js笔记

JsPang原文地址:http://jspang.com/detailed?id=79

初始化项目

安装yarn

npm i -g yarn

创建目录并进入

mkdir egg
cd egg

创建egg项目

yarn create egg --type=simple

安装依赖

yarn install

运行

yarn dev // 调试
// 127.0.0.1:7001


get和post请求传参

get请求

  1. 自由传参

    • 不在router中定义传参
    • 在Controller中 获取: ctx.query
  2. 严格传参

    • router中定义: “/my/:name/:age”

    • 在Controller中 获取: ctx.params.name ctx.params.age

post 请求

关闭csrf

config.security = {
    csrf: {
        enable: false
    }
}

// service



ejs

安装

yarn add egg-view-ejs

配置

plugin.js

exports.ejs = {

​    enable: true,

​    package: 'egg-view-ejs'

}

config.default.js

config.view = {

​    mapping: {

​        ".html": "ejs",    // 所有html文件用ejs模板

​    }

};


config.ejs = {

​    delimiter: '${content}#x27;,    // 更改ejs模板默认分隔符,原本是%

}

简单使用

新建html文件

app/view/index.html

controller渲染刚才创建的文件

await ctx.render('index.html', {data})

html中显示controller中的数据: <%= id %>

循环展示列表数据:

<% for(var i = 0; i<arr.length; i ++){ %>
    <li><%= arr[i] %></li>
<% } %>

引入公共html

<% include header.html %>

静态资源

app/public — css/js/img

引入静态资源

<link rel="stylesheet" type="text/css" href="public/css/default.css" />

更改静态资源url访问前缀名称

config.default.js

config.static = {

​    prefix: '/assets/',    // 原本默认是public

}


// 增加
ctx.cookies.set('key', 'value', 'options')
// options
{
    maxAge: 1000 * 2,    // 毫秒
    httpOnly: false,    // 只能在服务端操作cookie,默认true
    encrypt: true        // 加密, 原不支持中文cookie
}


// 删除
ctx.cookies.set('key', null)
// 获取
ctx.cookies.get('key')
// 获取加密后的
ctx.cookies.get('key', {encrypt:true})


session 操作,支持中文

// 设置
ctx.session.username = 'aaa'
// 修改
ctx.session.username = 'ssss'
// 查看
ctx.session.username
// 删除
ctx.session.username = null

全局更改session配置

config.default.js

config.session = {

​    key: 'CUSTOM_SESS',    // 更改session默认的cookie键名称

​    httpOnly: false,    // 只服务端可修改

​    maxAge: 1000 * 1,    // 过期时间

​    renew: true,    // 访问页面/交互 自动刷新过期时间

}


中间件app/middleware

//定义

// app/middleware/couter.js

module.export = option => {
    retuen async (ctx, next) {
        // todo...
        await next()
    }
}

// 全局使用

config/config.default.js

config.middleware = ['couter']

// 局部使用

router.js

const couter = app.middleware.couter()
router.get("/my", couter, controller.my.index)


扩展:

applation扩展:

app/extend/applation.js

module.exports = {
    // 方法扩展
    currentTime() {
        retuen getTime()
    }
    // 属性扩展
    get timeProp {
        retuen getTime()
    }
}
function getTime() {
    let nowTime = new Date()
    ...
    retuen nowTime
}

使用扩展

app/controller/index.js

async index () {
    const {ctx, app} = this;
    await ctx.render('index.html', {
        // 使用扩展方法
        nowTime: app.currentTime(),
        nowTime2: app.timeProp,
    })
}

扩展context

定义扩展

app/extend/context.js

module.exports = {
    // 获取请求参数
    params(key) {
        const method = this.request.method;
        if (method === 'GET') {
            retuen key ? this,query[key] :this,query
        } else {
            retuen key ? this.request.body[key]:this.request.body
        }
    }

}

使用扩展

app/controller/index.js

async index() {
    const {ctx} = this
    const params = ctx.params()
    console.log(params)
    ctx.body = 'index'
}

request扩展

定义扩展

app/extend/request.js

module.exports = {
    get token() {
        return this.get('token')
    }
}

使用扩展

app/controller/index.js

async index() {
    const {ctx} = this
    const token = ctx.request.token
    ctx.body = token
}

response扩展

定义扩展

app/extend/response.js

module.exports = {
    set token(token) {
        this.set('token', token)
    }
}

使用扩展

app/controller/index.js

async index() {
    const {ctx} = this
    ctx.response.token = 'token string'
    ctx.body = 'body'
}

helper.js扩展

定义扩展

app/extend/helper.js

module.exports = {
    base64Encode(str='') {
        retuen new Buffer(str).toString('base64')
    }
}

使用扩展

app/controller/index.js

async index() {
    const {ctx} = this
    ctx.response.token = 'token string'
    const base64 = ctx.helper.base64Encode('egg')
    ctx.body = base64
}


定时任务app/schedule

新建一个定时任务

// app.schedule/get-time.js

const Subscription = require('egg').Subscription

class GetTime extends Subscription{
    static get schedule() {
        retuen  {
            // interval: '3s',        // 等价
            // cron: '*/3 * * * * *'    // 秒、分钟、小时、哪一天(1-31)、月、天(0-7)
            type: 'worker'
        }
    }
    aysnc subscribe() {
        console.log(Date.noew())
    }
}

module.exports = GetTime


mysql 操作

npm i egg-mysql -S

配置

config/plugin.js

exports.mysql = {
    enable:true,
    package: 'egg-mysql'
}
// config/config.default.js

config.mysql = {
    app: true,
    agent: false,    // 代理
    client: {
        host: '127.0.0.1',
        port: '3306',
        user: 'root',
        password: 'root',
        database: 'test_egg'
    }
}
// 操作数据库加 try_catch
// 查
app.mysql.select('表名')
// 增
app.mysql.insert('表名', 参数)
// 修改 param要有id
app.mysql.update('表名', 参数)
// 删除
app.mysql.delete('表名', id)

egg.js写的一个微信小程序

https://blog.zhanghaoran.ren/image/1645580639180下载.png